#include "complex_apps.h"

int func(int a, std::string b) { return 0;}


int comprehensive_apps() {
    //! 使用C++11实现C++11的 std::optional类
    Optional<std::string> a("ok");

    Optional<Struct> op;
    std::cout << std::boolalpha << bool(op) << std::endl;    // false
    op.emplace(1, 2);
    std::cout << std::boolalpha << bool(op) << std::endl;    // true

    //! 2. 使用C++11实现惰性求值
    // R => int， Args... = > [int, ]
    Task<int(int)> task([](int i){ return i; });             // 调用的move构造
    // task.run(123456);                                     // ok: 123456

    //! 3. 实现lambda表达式的链式调用
    //! 每次then就将原来的_func给move点，所以task的_func已经不在了
    auto ret = task.then([](int i) { return i+1; })            
                    .then([](int i) { return i+2; })
                    .then([](float i) { return i*i; })
                    .run(1);
    // task.run(123456);                                     // TODO: 会报错, 可以采用捕获this指针的方法
        

    //! function_traits C++11没有，自己实现
    // std::cout << typeid(std::function_traits<decltype(func)>::function_type).name() << std::endl;

    return 0;
}